home *** CD-ROM | disk | FTP | other *** search
/ Interplay's Learn to Program Basic (Review Copy) / Learn to Program Basic Review Copy (Interplay)(June 23, 1998).ISO / pc / ltpbasic / projects / sprmaker.bas < prev    next >
BASIC Source File  |  1998-03-12  |  6KB  |  259 lines

  1. CLS
  2. TextColor 167 'Blue Hawaii
  3. Print "This program can be used to"
  4. Print "help you build sprite sets"
  5. Print "of your own!"
  6. Print
  7. Print "To do this, create your sprites"
  8. Print "using a separate paint program."
  9. Print "Put your sprite images against"
  10. Print "a solid color background, and"
  11. Print "draw a rectangle around each"
  12. Print "individual sprite cell."
  13. Print
  14. TextColor 21 'Black Is Black
  15. Print "Name of .BMP file to load:"
  16. Input Bitmap$
  17. Print "Name for the resulting SpriteSet:"
  18. Input SpriteSet$
  19.  
  20. CLS
  21. Background Bitmap$
  22. xStart = 0
  23. yStart = 0
  24.  
  25. TextColor 96 'Red
  26. Position 2,13
  27. Print "Scanning rectangles...Please Wait"
  28.  
  29. Rem Set up a list of rectangles
  30. maxRects = 200
  31. Dim RectList(maxRects,4)
  32. Rem Identify the meanings of each
  33. Rem value for the second subscript of 
  34. Rem the rectangle array
  35. rcLeft = 1
  36. rcTop = 2
  37. rcRight = 3
  38. rcBottom = 4
  39. Rem The number of rectangles we have
  40. numRects = 0
  41.  
  42. Rem Get the background pixel value
  43. Rem it is always assumed that the
  44. Rem color at 0,0 is transparent!
  45. empty = PGet(0,0)
  46.  
  47. Rem Fill the screen to this color
  48. Rem then load the background again
  49. Rem this is to avoid problems that
  50. Rem occur if BMP is less than 320x240
  51. Color empty
  52. FillRect 0,0 to 320,240
  53. Background Bitmap$
  54.  
  55. Rem Load a sound we'll use as a beep
  56. beep = LoadSound("Pop")
  57. doneSnd = LoadSound("Payoff")
  58.  
  59. Rem ------------------------
  60. Rem Main Process
  61. Rem ------------------------
  62.  
  63. Rem Gather up all the rectangles
  64. result = TRUE
  65. While result = TRUE
  66. Gosub GetNextRect
  67. if result = TRUE Then
  68. Rem if we find a rectangle,
  69. Rem change the color of it's
  70. Rem outline so we know it was
  71. Rem found, and make a sound
  72. Color PGet(left,top) % 255
  73. Rect left,top To right,bottom
  74. PlaySound(beep)
  75. Endif
  76. Wend
  77.  
  78. Rem Now, go through the list 
  79. Rem and make them into sprites
  80. For i = 1 To numRects
  81. If i = 1 Then
  82. Rem First time, we use the REPLACE option!
  83. Rem Get the rectangle INSIDE the frame!
  84. MakeSprite SpriteSet$ Rect RectList(i,rcLeft)+1,RectList(i,rcTop)+1 To RectList(i,rcRight)-1,RectList(i,rcBottom)-1 TRANSPARENT=empty REPLACE
  85. Else
  86. Rem For remaining sprite cells, we just append to the existing file
  87. Rem Get the rectangle INSIDE the frame!
  88. MakeSprite SpriteSet$ Rect RectList(i,rcLeft)+1,RectList(i,rcTop)+1 To RectList(i,rcRight)-1,RectList(i,rcBottom)-1 TRANSPARENT=empty
  89. EndIf
  90. Rem To give some visual feedback, 
  91. Rem let's 'erase' the image from the screen
  92. Rem after we process it
  93. Color empty
  94. FillRect RectList(i,rcLeft),RectList(i,rcTop) To RectList(i,rcRight),RectList(i,rcBottom)
  95. Next i
  96.  
  97. Rem All done!
  98. PlaySound(doneSnd)
  99. Rem Now, cycle through the sprites
  100. Position 2,12
  101. Print "Processed ";SpriteSet$;" into ";numRects;" frames."
  102. Print "                                   "
  103. Position 10,13
  104. Print "Press a key to exit"
  105. spr = LoadSprite(SpriteSet$)
  106. SetSprite spr to 0,0
  107. CycleSprite spr Speed 2
  108. While Inkey$ <> ""
  109. Wend
  110. While Inkey$ = ""
  111. Wend
  112. HideSprite spr
  113. CLS
  114. END
  115.  
  116. Rem --------------------
  117. Rem Find a rectangle
  118. Rem If found, add to list
  119. Rem
  120. Rem result will be TRUE if
  121. Rem a rectangle was added
  122. Rem ----------------------
  123. GetNextRect:
  124. Gosub Scan
  125. If result = TRUE Then
  126. numRects = numRects + 1
  127. Rem See if we went too far!
  128. If numRects > maxRects Then 
  129. CLS
  130. Print "There are too many"
  131. Print "rectangles in this picture."
  132. Print
  133. Print "Scanning aborted."
  134. End
  135. Endif
  136.  
  137. RectList(numRects,rcLeft) = left
  138. RectList(numRects,rcTop) = top
  139. RectList(numRects,rcRight) = right
  140. RectList(numRects,rcBottom) = bottom
  141. Endif
  142. Return
  143.  
  144.  
  145. Rem --------------------------
  146. Rem Check to see if a given x,y
  147. Rem exists in any of the rectangles
  148. Rem in the rectangle list
  149. Rem
  150. Rem result will be TRUE if the
  151. Rem point is contain within one
  152. Rem of the recorded rectangles
  153. Rem ---------------------------
  154. CheckPoint:
  155. For i = 1 to numRects
  156. If x >= RectList(i,rcLeft) AND x <= RectList(i,rcRight) Then
  157. If y >= RectList(i,rcTop) AND y <= RectList(i,rcBottom) Then
  158. Rem X and Y are part of this rect. 
  159. Rem return with left,top,right,bottom = the rect we're in
  160. left = RectList(i,rcLeft)
  161. top = RectList(i,rcTop)
  162. right = RectList(i,rcRight)
  163. bottom = RectList(i,rcBottom)
  164. result = TRUE
  165. return
  166. EndIf
  167. EndIf
  168. Next i
  169. result = FALSE
  170. return
  171.  
  172.  
  173. Rem ---------------------
  174. Rem Scan for a rectangle
  175. Rem
  176. Rem start scanning at
  177. Rem xStart,yStart
  178. Rem result will be TRUE if
  179. Rem a rectangle was found
  180. Rem and left,top,right,bottom
  181. Rem will contain the coordinates
  182. Rem --------------------
  183. Scan:
  184. Rem Look for upper left
  185. x = xStart
  186. y = yStart
  187. foundStart = FALSE
  188. While foundStart = FALSE AND y < 238
  189. Rem Find a non-transparent pixel
  190. If PGet(x,y) <> empty then
  191. Rem see if it looks like a rectangle starts here
  192. If PGet(x,y+1) AND PGet(x+1,y) <> empty Then
  193. Rem see if this is part of another rectangle
  194. Gosub CheckPoint 
  195. If Result = TRUE then
  196. Rem if it is within another rect, skip to the right edge and continue
  197. x = right+1
  198. Else
  199. foundStart = TRUE
  200. Endif
  201. Else 
  202. Rem Doesn't appear to be a rectangle start. Keep looking
  203. x = x+1
  204. Rem If we get to the edge, wrap to next line
  205. If x > 317 Then
  206. x = 0
  207. y = y + 1
  208. EndIf
  209. EndIf
  210. Else
  211. Rem Just found background color here. Keep looking.
  212. x = x + 1
  213. Rem If we get to the edge, wrap to next line
  214. If x > 317 Then
  215. x = 0
  216. y = y + 1
  217. EndIf
  218. Endif
  219. Wend
  220. If FoundStart Then
  221. Rem This may or may not be a real rectangle
  222. Rem we have to scan it to find out
  223. left = x
  224. top = y
  225. right = left
  226. bottom = top
  227. While PGet(x,y) <> empty AND x < 320
  228. x = x + 1
  229. Wend
  230. right = x - 1
  231. While PGet(left,y) <> empty AND PGet(right,y) <> empty AND y < 240
  232. y = y + 1
  233. Wend
  234. bottom = y - 1
  235.  
  236. Rem Now check the rectangle to see if it makes sense
  237. Rem Rectangles must contain at least one enclosed pixel
  238. If right - left > 1 AND bottom - top > 1 Then
  239. result = TRUE
  240. else
  241. Rem Not really a rectangle
  242. xStart = right+1
  243. yStart = top
  244. Rem Keep Looking
  245. Goto Scan
  246. Endif
  247.  
  248. Else
  249. result = FALSE
  250. EndIf
  251. Return
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.